#pragma once

#ifndef Vector3FLOAT_H
#define Vector3FLOAT_H

//interface to implement
#include "IVector3.h"

class Vector3FLOAT : public IVector3
{
private:
	//Four float describing the vector. w is the homogeneous coordinate.
	float _x, _y, _z, _w;

public:
	//constructor. Puts everything to 0.
	Vector3FLOAT();

	//Constructor. Puts everything to the value of f.
	Vector3FLOAT(float f);

	//Constructor. Set the value to x, y and z.
	Vector3FLOAT(float x, float y, float z);

	//Destructor.
	~Vector3FLOAT();

	//Get X
	inline float getX() const;

	//Get Y
	inline float getY() const;

	//Get Z
	inline float getZ() const;

	//Get W
	inline float getW() const;

	//Setter
	inline void set(float x, float y, float z);

	//norme
	inline float getNorme() const;

};

//addition
extern inline void Vector3FLOATAdd(const Vector3FLOAT& v1, const Vector3FLOAT& v2, Vector3FLOAT& r);

//substract
extern inline void Vector3FLOATSub(const Vector3FLOAT&, const Vector3FLOAT&, Vector3FLOAT&);

//multiplication
extern inline void Vector3FLOATMulF(const Vector3FLOAT&, float f, Vector3FLOAT&);

//multiplication
extern inline void Vector3FLOATMul(const Vector3FLOAT&, const Vector3FLOAT&, Vector3FLOAT&);

//dot
extern inline float Vector3FLOATDot(const Vector3FLOAT&, const Vector3FLOAT&);

//normalize
extern inline void Vector3FLOATNormalize(const Vector3FLOAT&, Vector3FLOAT&);

//cross
extern inline void Vector3FLOATCross(const Vector3FLOAT&, const Vector3FLOAT&, Vector3FLOAT&);

#endif